/**
 * 394
 * 给定一个经过编码的字符串，返回它解码后的字符串。
 * <p>
 * 编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
 * <p>
 * 你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。
 * <p>
 * 此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。
 * <p>
 * 示例:
 * <p>
 * s = "3[a]2[bc]", 返回 "aaabcbc".
 * s = "3[a2[c]]", 返回 "accaccacc".
 * s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
 */


class Solution {

    public String decodeString(String s) {
        if(s == null ){
            return "";
        }
        int[] index = new int[]{0};
        return makeString(s,index);
    }

    private String makeString(String str,int[] index){

       if(str == null || str.length() == 0 || index[0] >= str.length()){
           return "";
       }

       StringBuilder strNum = new StringBuilder();
       StringBuilder strSub = new StringBuilder();

       for(;index[0]<str.length();index[0]++){

           char ch = str.charAt(index[0]);

           if(ch >= '0' && ch <= '9'){
               strNum.append(ch);
           }else if(ch=='['){
               index[0]++;
               String temp = makeString(str,index);
               int time =0;
               if(strNum != null && strNum.length()>0){
                   time = Integer.valueOf(strNum.toString());
               }
               int i=0;
               do{
                   strSub.append(temp);
                   i++;
               }while (i<time);
               strNum.delete(0,strNum.length());
           }else if(ch == ']'){
               //index++;
               break;
           }else{
               strSub.append(ch);
           }


       }
       return strSub.toString();

    }


}
